﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;
using System.Data.Objects;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class ControlloAccessoVerniciatoriFacade : FacadeBase<GestionePolveriEntities>
    {
        public ControlloAccessoVerniciatoriFacade()
        {

        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => Get(), callback);
        }

        public List<ControlloAccessoVerniciatore> Get()
        {
            List<ControlloAccessoVerniciatore> retValue = null;

            try
            {
                var obj = from x in this.GetContext().ControlloAccessoVerniciatori
                          select new ControlloAccessoVerniciatore
                          {
                              IDTurno = x.IDTurno,
                              Turno = x.Turni.Descrizione,
                              IDImpianto = x.IDImpianto,
                              Impianto = x.Impianti.Impianto,
                              IDOperatore = (x.aspnet_Users.UserId == null ? Guid.Empty : x.aspnet_Users.UserId),
                              Operatore = (x.aspnet_Users.UserId == null ? string.Empty : x.aspnet_Users.UserName),
                              IsBlocked = x.IsBlocked
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        public ControlloAccessoVerniciatore CheckBlocked(short idTurno, int idImpianto)
        {
            ControlloAccessoVerniciatore retValue = null;

            try
            {
                var obj = from x in this.GetContext().ControlloAccessoVerniciatori
                          where x.IDTurno == idTurno && x.IDImpianto == idImpianto
                          select new ControlloAccessoVerniciatore {
                              IDTurno = x.IDTurno,
                              Turno = x.Turni.Descrizione,
                              IDImpianto = x.IDImpianto,
                              Impianto = x.Impianti.Impianto,
                              IDOperatore = (x.IDOperatore.HasValue ? x.IDOperatore.Value : Guid.Empty),
                              Operatore = (x.IDOperatore.HasValue ? x.aspnet_Users.UserName : string.Empty),
                              IsBlocked = x.IsBlocked
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }

            return retValue;
        }

        public bool Block(short idTurno, int idImpianto, Guid idOperatore)
        {
            bool retValue = false;
            ControlloAccessoVerniciatori p = null;

            try
            {
                var obj = from x in this.GetContext().ControlloAccessoVerniciatori
                          where x.IDTurno == idTurno && x.IDImpianto == idImpianto 
                          select x;

                if (obj.Any())
                {
                    p = obj.FirstOrDefault();
                    p.IDOperatore = idOperatore;
                    p.IsBlocked = true;
                }
                else
                {
                    p = new ControlloAccessoVerniciatori();
                    p.IDTurno = idTurno;
                    p.IDImpianto = idImpianto;
                    p.IDOperatore = idOperatore;
                    p.IsBlocked = true;

                    this.GetContext().ControlloAccessoVerniciatori.AddObject(p);
                }

                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }

            return retValue;
        }

        public bool Unblock(short idTurno, int idImpianto, Guid idOperatore)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().ControlloAccessoVerniciatori
                          where x.IDTurno == idTurno && x.IDImpianto == idImpianto
                          select x;

                if (obj.Any())
                {
                    ControlloAccessoVerniciatori p = obj.FirstOrDefault();
                    p.IDOperatore = null;
                    p.IsBlocked = false;

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }

            return retValue;
        }

        public bool Delete(short idTurno, int idImpianto)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().ControlloAccessoVerniciatori
                          where x.IDTurno == idTurno && x.IDImpianto == idImpianto
                          select x;

                if (obj.Any())
                {
                    ControlloAccessoVerniciatori cav = obj.FirstOrDefault();
                    this.GetContext().ControlloAccessoVerniciatori.DeleteObject(cav);

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }

            return retValue;
        }
    }
}
